/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package tienda.controladores;

import alexpaz.clasesbase.AccionMntto;
import alexpaz.clasesbase.ControladorBase;
import alexpaz.clasesbase.DTO;
import alexpaz.clasesbase.DialogoSeleccion;
import alexpaz.clasesbase.FrameBase;
import alexpaz.clasesbase.PnlMntto;
import alexpaz.clasesbase.excepciones.ExcepcionDeAplicacion;
import alexpaz.clasesbase.excepciones.ExcepcionDeBD;
import java.util.ArrayList;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.event.InternalFrameAdapter;
import javax.swing.event.InternalFrameEvent;
import tienda.modelos.MdlProductos;
import tienda.vistas.productos.IfrMnttoProductos;
import tienda.vistas.productos.TableDTOAdapterProductos;

/**
 *
 * @author Alex Paz
 */
public class CtrProductos extends ControladorBase {

    private MdlProductos modeloProductos = new MdlProductos();
    private IfrMnttoProductos ifrMnttoProductos;
    private DialogoSeleccion dlgSeleccionarProducto = null;

    public CtrProductos(FrameBase principal) {
        super(principal);
    }

    void mantenerProductos() {
        if (ifrMnttoProductos != null) {
            return;
        }
        ifrMnttoProductos = new IfrMnttoProductos();
        final PnlMntto panel = ifrMnttoProductos.getPanelMntto();

        panel.addAccionMnttoRegistrarDTO(new AccionMntto() {
            @Override
            public void realizarAccionMntto() {
                try {
                    modeloProductos.registrarProducto(ifrMnttoProductos.getValores());
                    ifrMnttoProductos.mostrarMensajeInformativo("El registro del Producto fué exitoso", "Registro exitoso");
                    ifrMnttoProductos.limpiarCampos();
                } catch (ExcepcionDeAplicacion ex) {
                    //TODO: Implementar código de control
                    Logger.getLogger(CtrProductos.class.getName()).log(Level.SEVERE, null, ex);
                } catch (ExcepcionDeBD ex) {
                    ifrMnttoProductos.mostrarMensajeError(ex.getMessage(), "Error de Base de Datos");
                }
            }
        });

        panel.addAccionMnttoBuscarDTO(new AccionMntto() {
            @Override
            public void realizarAccionMntto() {
                ArrayList<DTO> productosCoincidentes;
                try {
                    productosCoincidentes =
                            modeloProductos.buscarPorColumna("NombreProducto", ifrMnttoProductos.getValores().get("Nombre"));

                    if (productosCoincidentes.isEmpty()) {
                        ifrMnttoProductos.mostrarMensajeInformativo("No se encontraron coincidencias", "Sin coincidencias");
                        ifrMnttoProductos.limpiarCampos();
                    } else if (productosCoincidentes.size() != 1) {

                        dlgSeleccionarProducto = new DialogoSeleccion(principal, true,
                                new TableDTOAdapterProductos(productosCoincidentes)) {

                            @Override
                            public void accionSeleccionarItem() {
                                dtoSeleccionado = dlgSeleccionarProducto.getTabla().getDTOSeleccionado();
                                    ifrMnttoProductos.mostrarDTOEncontrado(
                                            dtoSeleccionado);
                                    dlgSeleccionarProducto.setVisible(false);
                                    dlgSeleccionarProducto = null;
                            }

                            @Override
                            public void accionCerrarVentana() {
                                 if (dtoSeleccionado==null) {
                                    ifrMnttoProductos.limpiarCampos();
                                }
                            }
                            
                        };

                        dlgSeleccionarProducto.setVisible(true);
                    } else {
                        dtoSeleccionado = productosCoincidentes.get(0);
                        ifrMnttoProductos.mostrarDTOEncontrado(dtoSeleccionado);
                    }
                } catch (ExcepcionDeBD ex) {
                    ifrMnttoProductos.mostrarMensajeError(ex.getMessage(), "Error de Base de Datos");
                }
            }
        });

        panel.addAccionMnttoEliminarDTO(new AccionMntto() {

            @Override
            public void realizarAccionMntto() {
                try {
                    if (ifrMnttoProductos
                            .mostrarMensajeConfirmación("¿Confirma la eliminación de este producto?", 
                            "Confirmación") == 0){
                        modeloProductos.eliminarProducto (dtoSeleccionado);
                        dtoSeleccionado = null;
                        ifrMnttoProductos.mostrarMensajeInformativo("Eliminación exitosa", "Transacción exitosa");
                    }
                    ifrMnttoProductos.limpiarCampos();
                } catch (ExcepcionDeBD ex) {
                    ifrMnttoProductos.mostrarMensajeError(ex.getMessage(), "Error de Base de Datos");
                }
            }
        });
        
        panel.addAccionMnttoModificarDTO(new AccionMntto() {

            @Override
            public void realizarAccionMntto() {
                try {
                    if (ifrMnttoProductos
                            .mostrarMensajeConfirmación("¿Confirma la modificación de este producto?", 
                            "Confirmación") == 0){
                        modeloProductos.modificarProducto (dtoSeleccionado);
                        dtoSeleccionado = null;
                        ifrMnttoProductos.mostrarMensajeInformativo("Modificación exitosa", "Modificación exitosa");
                    }
                    ifrMnttoProductos.limpiarCampos();
                } catch (ExcepcionDeBD ex) {
                    ifrMnttoProductos.mostrarMensajeError(ex.getMessage(), "Error de Base de Datos");
                }
            }
        });
        
        panel.addAccionMnttoSalir(
                new AccionMntto() {
            @Override
            public void realizarAccionMntto() {
                ifrMnttoProductos.setVisible(false);
                ifrMnttoProductos = null;
            }
        });
        ifrMnttoProductos.addInternalFrameListener(
                new InternalFrameAdapter() {
            @Override
            public void internalFrameClosed(InternalFrameEvent e) {
                ifrMnttoProductos = null;
            }
        });

        principal.addInternalFrame(ifrMnttoProductos);
    }
}
